Le bus I2c est caractérisé par une liaison en mode série réalisée à l'aide de 2 Fils. C'est la société Philips qui en a créé le concept au début des années 80. Son succès est lié à sa simplicité.
Voici l'architecture type d'un bus I2C, on remarque que plusieurs composants viennent se "greffer" sur le même bus.
Les données transitent par les lignes :
- SDA (Serial Data Line) : ligne de données bidirectionnelle, générée par le Maitre ou l'Esclave.
- SCL (Serial Clock Line) : ligne d'horloge générée par le Maitre.
La communication sur le bus est orchestré de la manière suivante :
Le Maitre envoie sur le bus l'adresse du composant avec qui il souhaite communiquer,chacun des esclaves ayant une adresse fixe,
l'esclave qui se reconnaît répond à son tour par un signal de confirmation, puis le Maitre continue la procédure de communication... .(écriture/lecture)
Dans tout les cas, les transactions seront confirmées par un ACK
Caractéristiques électrique:
Tension de bus : 5VDC
Fréquence maximale de fonctionnement : 400 kHz (variable suivant les composants connectés au bus, voir datasheet)
Etat logique Haut : de 3 à 5 Volts
Etat logique Bas : de 0 à 1,5 Volt
Capacité maximum admissible sur le bus : 400 pF
Temps de monté des signaux : inférieur à 1 µs
Temps de stabilité pour prise en compte d'un signal : supérieur à 5 µs (règle générale)
Résistance de rappel : à calculer en fonction de l'impédance du Bus (valeurs pratiques constatées de 1,5 k à 3,5 k)
Distance de communication : Quelque dizaines de centimètres, et plusieurs mètres avec un tampon.
Les bases du protocole:
LA CONDITION DE REPOS :
Condition dans laquelle aucun composant ne communique, les lignes de bus sont à l'état Haut :
LA CONDITION DE DEPART :
Le Maitre force la ligne SDA au niveau bas pour "réveiller" les Esclaves quand SCL est au niveau haut :
LA CONDITION D'ARRET :
Les lignes SDA et SCL sont au niveau bas, puis quand SCL passe au niveau haut, le Maitre libère la ligne SDA au niveau haut. A cet instant le bus est considéré comme disponible :
L'ACQUITTEMENT :
Une fois les données transmises, un acquittement est opéré par celui qui reçoit les donnés. Cette procédure est réalisée en fin de trame de transmission, soit à la neuvième impulsion. Le récepteur maintien la ligne SDA au niveau bas pendant le front d'horloge :
A RETENIR :
* En communication, toujours respecter la règle suivante : Le signal SDA doit être stable aussi longtemps que le signal SCL est actif. Un changement d'état de la ligne SDA pendant que le signal SCL est au niveau haut implique une condition de départ ou d'arrêt
Trame de Communication:
ARCHITECTURE D'UNE TRAME :
Nous avons vu précédemment les opérations de base effectuées sur le Bus I2C, voyons maintenant comment assembler ces "morceaux" afin de constituer une trame complète.
Dans un premier temps, il faut réveiller le bus en réalisant une conditions de départ, ensuite viennent s'intercaler les trames de données. L'Esclave ayant reçu les informations acquittera le Maitre pour lui faire savoir qu'il à bien reçu la trame de données, dans le cas contraire, c'est au maitre de recommencer la transactions depuis le départ. Pour finir le signal de Stop mettra fin à toute communication.
L'ADRESSAGE :
Pour pouvoir communiquer avec les différents composant raccordés au bus, nous allons détailler le protocole de communication qui permet d'orchestrer les échanges.
Dans une premier temps, et après avoir émis une condition de départ, il faut que le Maitre indique avec quel Esclave il souhaite se connecter, pour cela il enverra sur le bus l'adresse de l'Esclave composé de 7 bits (voir annexe), puis un dernier indiquant le sens du transfert : Lecture (1) ou Écriture (0).
L'esclave reconnaissant sont adresse validera par un acquittement...
LA COMMUNICATION PAR OCTET :
Nous allons prendre comme exemples les cas suivants afin de visualiser à quoi peut ressembler un échange complet sur le bus entre Maitre et Esclave
Exemple : Écriture de donnés dans une mémoire EEPROM I2C :
La séquence se décompose ainsi :
- Condition de départ
- Emission de l'adresse esclave, soit de L'EEPROM
- Acquittement de la part de l'esclave
- Emission par le maitre de l'adresse mémoire à laquelle il souhaite inscrire les futures données, acquittement successif de l'esclave
- Transmission des données à écrire, acquittement à chaque reception de paquet par l'esclave
- Condition de stop
On remarque que le maitre, après avoir émis l'adresse de stockage des donnés, n'a pas besoin d'interrompre la communication à chaque octet et d'écrire à nouveau l'adresse de pointage. En règle générale les composants I2C sont à 'auto-chargement', c'est à dire que leur pointeur d''adresse s'incrémente automatiquement en fin d'émission et ce pour la valeur de 8 octets.
Exemple : Lecture de donnés dans une mémoire EEPROM I2C :
La séquence se décompose ainsi :
- Condition de départ
- Emission de l'adresse esclave, soit de L'EEPROM, avec une demande d'écriture. Pourquoi ? simplement pour faire pointer le registre interne de la mémoire sur l'adresse choisi. il s'agit simplement du positionnement du pointeur interne, sans cela , la lecture se ferai à la valeur contenue dans ce pointeur, ce qui ne vous retournerez pas les bonnes valeurs
- Acquittement de la part de l'esclave et condition de stop (Restart est possible)
- Condition de départ
- Emission de l'adresse esclave, soit de L'EEPROM, avec une demande de lecture cette fois. le composant confirme l'ordre et les données sont envoyés. La lecture peut se faire par bloc, dans ce cas il faut confirmer chaque donnée lu par un ACK, puis avant la condition de stop, envoyé un NACK.
- Condition de stop
NB : Condition valable pour les opérations de lecture et écriture : Le maitre n'est pas obligé d'arreter le bus pour changer une adresse d'écriture ou lecture : du moment qu'il doit communiquer avec le même composant , il peut émettre une conditions de "re-départ", ce qui permet de gagner en temps sur la globalité d'une opération. La condition de "re-départ" est équivalente à une conditions de départ.
Cette instructions a aussi comme but de ne pas se faire "voler" le bus dans le cas ou il y plusieurs maitre.
Comme expliqué précèdement, chaque composant qui constitue le bus I2C est attribué d'une adresse, mais que faire si il y avait plusieurs fois les mêmes type de composant présents sur le bus ?
Pour généraliser, chaque famille circuit et composé d'une adresse "silicium" , indélébile et non modifiable, puis une autre partie entièrement configurable de manière externe, totalement accessible au niveau des bornes du circuit intégré :
Dans l'exemple ci-dessous, l'adresse du PCF8583 (Horloge-calendrier + RAM) est composé de 6 bits fixes et 1 modifiable, soit la possibilité de brancher 2 circuits identiques sur le bus.
Tableau d'attribution des adresses fixes :
Ci-contre un tableau reprenant les composant I2C les plus utilisés ainsi que la composition de leurs adresses fixes :
Type
Description
Adresse Fixe
PCD 3311
Générateur / Décodeur DTMF
010010x
PCF 8570
RAM Statique 2 Ko (256 x 8)
1010xxx
PCF 8573
Horloge/Calendrier temps réel
11010xx
PCF 8574
Extension de port parallèle 8 Bits
0100xxx
PCF 8552
EEprom 2 Ko (256 x 8)
1010xxx
PCF 8583
Horloge/Calendrier temps réel + 240 Octets de RAM
101000x
PCF 8591
Convertisseur A/N N/A 8 Bits
1001xxx
SAA 1064
Drivers d'affichage à leds 4 Digits
01110xx
M24C256
EEprom 128 Ko (32k x 8)
1010xxx
On remarque que certains circuits possèdent la même adresse, mais il s'agit uniquement de composants de fonctions similaires comme les mémoires...